#include "drv_usart.h"
#include "string.h"
#include "drv_sht20.h"
#include "drv_duo.h"
#include "drv_motor.h"
#include "drv_seg.h"
#include "drv_systick.h"
#include "drv_time.h"
#include "drv_yuyin.h"
#include "drv_spi.h"
#include "yoled.h"
 #include "oled.h"
#include "drv_beep.h"
// 定义全局缓冲区和索引，用于在中断中保存接收的数据
uint8_t usart2_rx_buf[20]={"0"} ; 	//接收数据字符串
uint8_t usart2_rx_idx = 0; 			//接收数据字符串下标
uint8_t isaction = 0;// 机器狗动作标志位，0表示不动，1表示动
uint8_t rx_data;  // 全局变量用于存储接收的数据(单个数据)

	uint8_t st=0; 
	uint8_t da=0;
 uint16_t fan_pwm1=0;
 
// USART2中断服务函数
void USART2_IRQHandler(void) 
{

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        
        // 读取接收到的数据
        rx_data = USART_ReceiveData(USART2);
        
        // 回显数据到USART2（可选）
//        USART_SendData(USART2, rx_data);
        
        // 打印收到的信息
		
        USART6_SendData(&rx_data, 1);
        
        // 存储数据到缓冲区，用于命令识别
        if (usart2_rx_idx < sizeof(usart2_rx_buf) - 1)  // 预留一个位置给结束符
        {     
			
            // 判断是否接收到换行符或回车符（作为命令结束标志）
            if (rx_data == '\n' || rx_data == '\r')
            {
                usart2_rx_buf[usart2_rx_idx] = '\0';  // 添加字符串结束符
                
                // 比较接收到的字符串
                if(strcmp((char*)usart2_rx_buf, "ledopen") == 0)
                {
					printf("usart2_rx_buf/r/n");
                    GPIO_SetBits(GPIOC, GPIO_Pin_4 );  // 点亮LED（根据硬件修改）
					GPIO_SetBits(GPIOC, GPIO_Pin_3 );
					GPIO_SetBits(GPIOC, GPIO_Pin_13 );
                }
                else if(strcmp((char*)usart2_rx_buf, "ledclose") == 0)
                {
                    GPIO_ResetBits(GPIOC, GPIO_Pin_4 ); // 熄灭LED（根据硬件修改）
					GPIO_ResetBits(GPIOC, GPIO_Pin_3);
					GPIO_ResetBits(GPIOC, GPIO_Pin_13);
                }
		
				//风扇
				  if(strcmp((char*)usart2_rx_buf, "FAN0") == 0)
                {
					 
					  fan_pwm1=0;
					  TIM_SetCompare1(TIM3,fan_pwm1);
						
				}
                
                else if(strcmp((char*)usart2_rx_buf, "FAN1") == 0)
                {
                    fan_pwm1=5000;
	               TIM_SetCompare1(TIM3,fan_pwm1);
					
                }
				if(strcmp((char*)usart2_rx_buf, "FAN2") == 0)
                {
					fan_pwm1=7000;
	               TIM_SetCompare1(TIM3,fan_pwm1);
					
				}
				
				else if(strcmp((char*)usart2_rx_buf, "FAN3") == 0)
				{
					fan_pwm1=10000;
	               TIM_SetCompare1(TIM3,fan_pwm1);
					
				}
				
				
				// 狗停止
		else if(strcmp((char*)usart2_rx_buf, "up") == 0)
		{
	 
        current_state = STATE_STANDUP;
        reset_dog_action();
		
		 
		}
    else if(strcmp((char*)usart2_rx_buf, "down") == 0)
		{
        current_state = STATE_LIEDOWN;
        reset_dog_action();
			
		}
    else if(strcmp((char*)usart2_rx_buf, "run") == 0)
		{
        current_state = STATE_FRONT;
        reset_dog_action();
				
		}
    else if(strcmp((char*)usart2_rx_buf, "back") == 0)
		{
        current_state = STATE_BACK;
        reset_dog_action();
		
		}
    else if(strcmp((char*)usart2_rx_buf, "stop") == 0)
		{
        current_state = 0xFF;  // 停止状态
        reset_dog_action();
		
		}
				
				// oled切换模式
			
			
			 if(strcmp((char*)usart2_rx_buf, "ws") == 0)
			{
                      yoled ();  
				
			}
			if(strcmp((char*)usart2_rx_buf, "tp") == 0)
			{
                      BMP_8();  
				
			}
			if(strcmp((char*)usart2_rx_buf, "clear") == 0)
			{
                     OLED_Init() ;

			}
                // 马达
					if(strcmp((char*)usart2_rx_buf, "open") == 0)
                {
							 motor_open();
					
				}
				
					if(strcmp((char*)usart2_rx_buf, "close") == 0)
                {    
					
							motor_close();
				
				}
					if(strcmp((char*)usart2_rx_buf, "beep0") == 0)
                {
							 GPIO_SetBits(GPIOA, GPIO_Pin_15);
					
				}
				
					if(strcmp((char*)usart2_rx_buf, "beep") == 0)
                {    
					
							GPIO_ResetBits(GPIOA, GPIO_Pin_15);
				
				}
				   // 清空缓冲区，准备下一次接收
                memset(usart2_rx_buf, 0, sizeof(usart2_rx_buf));
                usart2_rx_idx = 0;
            }
		
            else
            {
                // 将数据存入缓冲区
                usart2_rx_buf[usart2_rx_idx++] = rx_data;
            }
        }
        else
        {
            // 缓冲区满，强制处理
            usart2_rx_buf[usart2_rx_idx] = '\0';
            // 转发当前缓冲区数据
            USART6_SendData(usart2_rx_buf, usart2_rx_idx);
            // 重置缓冲区
            memset(usart2_rx_buf, 0, sizeof(usart2_rx_buf));
            usart2_rx_idx = 0;
        }
    
}
}	
  uint16_t i=0;
// 发送数据到USART6
void USART6_SendData(uint8_t *data, uint16_t len) 
{
    for (i = 0; i < len; i++) 
	{
        // 等待发送缓冲区为空
        while (USART_GetFlagStatus(USART6, USART_FLAG_TXE) == RESET);
        USART_SendData(USART6, data[i]);
    }
    // 等待发送完成
    while (USART_GetFlagStatus(USART6, USART_FLAG_TC) == RESET);
}

